function B = PGP_precoder(H_eff, groups, P_T, alpha)
% PGP_PRECODER 每组处理基带预编码器（公式29-30）
%   输入：
%     H_eff: [K×b]有效信道矩阵
%     groups: [K×1]用户分组向量
%     P_T: 总发射功率
%     alpha: 正则化参数
%   输出：
%     B: [b×K]基带预编码矩阵（块对角）

    % ========== 1. 参数验证 ==========
    [K, b] = size(H_eff);
    G = length(unique(groups));
    if nargin < 4
        alpha = 1/K; % 默认正则化参数
    end
    
    % ========== 2. 初始化块对角矩阵 ==========
    B = zeros(b, K);
    
    % ========== 3. 遍历每个用户组 ==========
    for g = 1:G
        % 3.1 获取组内用户索引
        group_idx = find(groups == g);
        K_g = length(group_idx);
        
        % 3.2 提取组内有效信道
        H_g = H_eff(group_idx, :);
        
        % 3.3 组内RZF预编码（公式29）
        W_g = inv(H_g' * H_g + K_g * alpha * eye(b));
        B_g = W_g * H_g';
        
        % 3.4 组内功率归一化（公式30）
        pow_g = real(trace(H_g * W_g.^2 * H_g'));
        epsilon_g = sqrt(P_T * K_g / K / pow_g);
        B_g = epsilon_g * B_g;
        
        % 3.5 填充到块对角位置
        B(:, group_idx) = B_g;
    end
    
    % ========== 4. 块对角结构验证 ==========
%     validate_block_diagonal(B, groups);
end